AWS Marketplace Commerce Analytics Serviceを使ってS3に販売者レポートを保存する
AWS Marketplace Commerce Analytics Servicは、販売者側がAWS SDKを通じてMarketplaceの利用状況、サブスクリプション、およびに請求レポート等にアクセスできるようになります。
SDKを使用してリクエストしたデータは、データセットとしてAWSアカウントにあるS3バケットに配信されます。 配信されるデータはMarketplaceのコンソールからDLできる販売者レポートと同じデータに対応しています。
今回の目的として、Marketplaceでのデータを手動でDLして確認することもできるのですが、他のデータと連携したり、販売状況を確認してマーケティング等に活用するためにデータを溜めて分析できる状況を作りたいともいます。
やってみる
オンボーディングガイドによると、AWS Marketplace Commerce Analytics Service を使用するためには以下の手順に従っていけば良いとのこと。
- AWSアカウントで権限を設定
- 宛先のAmazon S3バケットを作成
- レスポンス通知用のAmazon SNSトピックを設定
- サービスプログラムに登録
- 設定を確認
AWSアカウントで権限を設定
SDKやCLIからデータセットをリクエストするために,以下のIAMアクセス許可ポリシーを作成してIAMユーザーに付与します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "marketplacecommerceanalytics:GenerateDataSet", "Resource": "*" } ] }
S3バケットを作成
リクエストしたデータが、指定したAmazon S3バケットに配信されるように専用のものを作成します。
S3バケットを作成する を参照。
レスポンス通知用のAmazon SNSトピックを設定
データセットが利用可能になったり、エラーが発生したりしたときに、この作成したトピックにメッセージを発行して通知できるようにします。
作成したSNSトピックのARNが今後必要になるので控えておきます。
Commerce Analytics Service プログラムに登録
トピックの ARN およびバケットの名前を使用してサービスを設定すると、Commerce Analytics Service はその Amazon S3 バケットおよび Amazon SNS トピックにアクセスするようになるので、有効になるようにしていきます。
Marketplace 製品を管理するために使用する AWS アカウントでログインし、Commerce Analytics Service 登録ページに移動します。
Your SNS Topic ARN
には作成したSNSトピックのARNを入力し、Your S3 Bucket Name
には作成したS3バケットの名前を入力します。- New IAM Role Name`ですが、これは登録の際、Commerce Analytics Serviceが自動的に作成するRoleの名前です。
- > AWS MarketplaceがAmazon S3バケットに書き込み、Amazon SNSトピックに通知を発行することを可能にします。 AWS Marketplaceは、このIAMロールでこれらの関連アクションを実行するために、アカウント452565589796を使用します。
上記の入力後、Enroll
ボタンを押して登録します、
IAM RoleにMarketplaceCommerceAnalyticsRole
という名前のロールが作成されているはずです。
設定を確認
設定が正常に動作しているかどうかを確認します。
AWS CLIで以下のコマンドを実行してみます。
aws marketplacecommerceanalytics generate-data-set \ --data-set-type "customer_subscriber_hourly_monthly_subscriptions" \ --data-set-publication-date "{TODAY'S-DATE}" \ --role-name-arn "{YOUR-ROLE-NAME-ARN}" \ --destination-s3-bucket-name "{YOUR-S3-BUCKET}" \ --destination-s3-prefix "test-prefix" \ --sns-topic-arn "{YOUR-SNS-TOPIC-ARN}" \ --profile {YOUR-PROFILE} \ --region us-east-1
--data-set-publication-date
は、ISO-8601形式を使用して現在の日付YYYY-MM-DDT00:00:00Z を指定する必要があります。--role-name-arn
は、登録プロセスで受け取ったロールのARNを指定します。--destination-s3-bucket-name
は、作成したS3バケットの名前を指定します。--destination-s3-prefix
は、データセットを保存する場所を指定します(ディレクトリ的な)--sns-topic-arn
は,作成したSNSトピックのARNを指定します。--profile
は,作成したIAMユーザーの権限で動かすAWS Credencialの名前を指定します。--region
は、us-east-1を指定します。- AWS MarketplaceCommerce Analytics Service は、米国東部 (バージニア北部) リージョンでのみ利用できる
が、ダメです。
以下のエラーが出ました
An error occurred (ValidationException) when calling the GenerateDataSet operation: User: arn:aws:sts::1111222233334444:assumed-role/MarketplaceCommerceAnalyticsRole/AWSMPBusinessIntelligenceService is not authorized to perform: iam:ListAttachedRolePolicies on resource: role MarketplaceCommerceAnalyticsRole because no identity-based policy allows the iam:ListAttachedRolePolicies action (Service: AmazonIdentityManagement; Status Code: 403; Error Code: AccessDenied; Request ID: ab98903b-dfc8-431d-887a-0c7090f29090; Proxy: null)
MarketplaceCommerceAnalyticsRole
にiam:ListAttachedRolePolicies
が許可されていないとのことなので追加してみます。
MarketplaceCommerceAnalyticsRole
に追加されているポリシーで、Statementに以下を追加します。
{ "Effect": "Allow", "Action": [ "iam:ListAttachedRolePolicies" ], "Resource": "arn:aws:iam::[[アカウントID]]:role/service-role/MarketplaceCommerceAnalyticsRole" },
追加後、もう一度コマンドを実行してみます。
が、またしてもダメです。
An error occurred (ValidationException) when calling the GenerateDataSet operation: Unable to find a policy given role name arn as arn:aws:iam::1111222233334444:role/service-role/MarketplaceCommerceAnalyticsRole, role policy name as MarketplaceCommerceAnalyticsPolicy
というエラーが出ました。
MarketplaceCommerceAnalyticsPolicy
という名前のポリシーがないよと。。。
Commerce Analytics Service プログラムに登録した時にできたRoleには、
oneClick_MarketplaceCommerceAnalyticsRole_<<ランダム数字>>
といった命名規則のポリシー名が作成されます。
ですので、このポリシーの中身をコピーし、新しくMarketplaceCommerceAnalyticsPolicy
ポリシーを作りました。
その後コマンドを実行してみると、
{ "dataSetRequestId": "6625b6fd-3a6e-495c-9a30-3acda650ba91" }
ようやく成功しました。
ドキュメントにも記載がありますが、dataSetRequestId
が返ってくると正常な応答とのことです。
リクエストしたデータが保存されているか確認
コマンド実行時に指定したS3バケットにレポートファイルが保存されたかどうか確認してみます。
customer_subscriber_hourly_monthly_subscriptions_2022-08-01.csv
といったように、
data-set-typeとdata-set-publication-dateに指定した内容のファイルが作成されていると成功です。
SNSでの通知
SNSトピックのサブスクリプションを何か登録し、受信すると、以下のようなメッセージが届きました。
{ "dataSetRequestId" : "445b8ded-12c6-42d3-aeb4-c8ae1a932665", "success" : true, "dataSetS3Location" : { "bucketName" : "<<保存したバケット名>>", "key" : "test-prefix/customer_subscriber_hourly_monthly_subscriptions_2022-08-01.csv" }, "dataSetMetaDataS3Location" : { "bucketName" : "<<保存したバケット名>>", "key" : "test-prefix/customer_subscriber_hourly_monthly_subscriptions_2022-08-01.meta.json" } }
保存バケットとレポートの場所を示すkey名が記載されていますね。
成功・失敗もわかるので自動化などを取り組む際は活用できそうです。
さまざまなデータセットを出力できるので、マーケットプレイスで販売しているのであればぜひ役に立てたいデータだと思われます。
色々出力して解析してみよう。